package com.example.demo.spring.beans.factory;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.core.ResolvableType;

/**
 * 定义获取bean以及bean的各种属性
 *
 * @author: htc
 * @date: Created in 15:15 2018/11/29.
 */
public interface MyBeanFactory {
    /**
     * 用来获取一个实例，并且将它和其他由FactoryBean创建的bean区分开来。
     */
    String FACTORY_BEAN_PREFIX = "&";

    /**
     * 返回指定bean的实例，该实例可以是共享的或独立的。
     *
     * @param name
     * @return
     * @throws BeansException
     */
    Object getBean(String name) throws BeansException;

    /**
     * 返回指定bean的实例，该实例可以是共享的或独立的
     *
     * @param name
     * @param requiredType
     * @param <T>
     * @return
     * @throws BeansException
     */
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;

    /**
     * 返回指定bean的实例，该实例可以是共享的或独立的
     * @param name
     * @param args
     * @return
     * @throws BeansException
     */
    Object getBean(String name, Object... args) throws BeansException;

    /**
     * 返回指定bean的实例，该实例可以是共享的或独立的
     * @param requiredType
     * @param <T>
     * @return
     * @throws BeansException
     */
    <T> T getBean(Class<T> requiredType) throws BeansException;

    /**
     * 返回指定bean的实例，该实例可以是共享的或独立的
     * @param requiredType
     * @param args
     * @param <T>
     * @return
     * @throws BeansException
     */
    <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

    /**
     * 检查BeanFactory中是否有定义指定的Bean或者是外部注册的单例
     * @param name
     * @return
     */
    boolean containsBean(String name);

    /**
     * 是否是单例
     * @param name
     * @return
     * @throws NoSuchBeanDefinitionException
     */
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

    /**
     * @param name
     * @return
     * @throws NoSuchBeanDefinitionException
     */
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

    /**
     * 检查指定bean 与指定的数据类型是否匹配
     * @param name
     * @param typeToMatch
     * @return
     * @throws NoSuchBeanDefinitionException
     */
    boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;

    /**
     * 检查指定bean 与指定的数据类型是否匹配
     * @param name
     * @param typeToMatch
     * @return
     * @throws NoSuchBeanDefinitionException
     */
    boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

    /**
     * 返回指定bean的类型
     * @param name
     * @return
     * @throws NoSuchBeanDefinitionException
     */
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;

    /**
     * 返回指定bean的所有别名
     * @param name
     * @return
     */
    String[] getAliases(String name);
}
